#ifndef CONTROLLER_H
#define CONTROLLER_H

#include "interface/common.h"
#include <vector>

/**
 * @class ControllerInterface
 *
 * @brief ControllerInterface类是一个基类，用于自行车模型(单舵轮模型)的路径跟踪控制器的实现。
 */
class ControllerInterface {
public:
    /**
     * @brief 创建ControllerInterface的实例(工厂方法)
     *
     * 此静态方法用于生成ControllerInterface的具体实现类对象，需要在内部完成创建。
     *
     * @return ControllerInterface* 新创建的控制器接口对象指针，若创建失败返回 @c nullptr
     */
    static ControllerInterface *create();

    /**
     * @brief 更新机器人的状态
     *
     * 该接口用于向控制器更新机器人的状态，包括位姿、线速度和角速度。
     *
     * @param poses 包含基座信息和前轮信息，其中poses[0]表示基座，pose[1]表示前轮。
     *
     */
    virtual void update(const std::vector<Odometry> &poses) = 0;

    /**
     * @brief 设置机器人需要跟踪的路径
     *
     * 该接口设置机器人路径，如果路径正常，控制器会自动进入跟踪状态
     *
     * @param path 一个Point类型的vector，表示机器人的路径。其中Point结构体包含x、y、航向角和曲率
     *
     */
    virtual void startFollow(std::vector<Point> path) = 0;

    /**
     * @brief 获取机器人的线速度和转向角
     *
     * 该接口用于获取路径跟随过程中，控制器返回的线速度和转向角
     * 只有getState()返回值为kFollowing时，输出才有效，其他
     * 时刻线输出为0
     *
     * @param lianer_vel: 计算得到的线速度。
     * @param steer_angle: 计算得到的转向角度。
     */
    virtual void getOut(float &lianer_vel, float &steer_angle) = 0;

    /**
     * @brief 获取当前的状态
     *
     * 该接口用于返回系统当前所处的状态，状态以整数形式表示
     *
     * @return int 表示系统状态的整数，具体对应关系如下：
     *         - 0: @c kInitializing - 系统正在进行初始化操作
     *         - 1: @c kIdle - 系统初始化完成，处于空闲状态，等待任务
     *         - 2: @c kFollowing - 系统正在执行路径跟随任务
     *         - 3: @c kPaused - 路径跟随任务被暂停
     *         - 4: @c kReachGoal - 路径跟随任务已成功完成，到达目标点
     *         - 5: @c kFailed - 路径跟随任务因某种原因失败
     */
    virtual FollowState getState() = 0;
};

#endif